#include <iostream>
#include <unistd.h>
#include <string>
#include <pthread.h>

using namespace std;

int tickets = 1000;
// 互斥锁的本质是将数据交换到寄存器内部 
// 静态初始化 不需要销毁

// 动态初始化
// int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t
// *restrict attr);
// 参数：
// mutex：要初始化的互斥量
// attr：NULL


// 重入并不是问题 而是现象 
// 是否能够重入是指导我们多线程可不可以调用
// 如果不能重入 则不应该多线程调用 否则就是线程不安全的 除非自己做线程保护
// 可以重入 则可以多线程调用
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* getTicket(void* args)
{
    while(true)
    {
        pthread_mutex_lock(&mutex);
        if(tickets > 0)
        {
            usleep(1000);
            cout << (char*)args << "抢到票了, 编号: " << tickets << endl;
            --tickets;
            pthread_mutex_unlock(&mutex);
        }
        else
        {
            usleep(1000);
            cout << (char*)args << "没抢到" << endl;
            pthread_mutex_unlock(&mutex);
            break;
        }
    }
}


int main()
{
    pthread_t t1, t2, t3, t4;
    pthread_create(&t1, nullptr, getTicket, (void*)("thread1"));
    pthread_create(&t2, nullptr, getTicket, (void*)("thread2"));
    pthread_create(&t3, nullptr, getTicket, (void*)("thread3"));
    pthread_create(&t4, nullptr, getTicket, (void*)("thread4"));
    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
    pthread_join(t4, nullptr);
    return 0;
}